package com.atguigu.gmall.product;

import java.util.concurrent.*;

/**
 * 异步编排
 * 注意单个方法测试 因为许多方法存在异步 造成输出结果混乱不知道哪个方法的
 */
public class CompletableFutureDemo1 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService threadPool = new ThreadPoolExecutor(2,
                5,
                2L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        //whenComplete() 两个任务一个线程  同步
        CompletableFuture.supplyAsync(() -> {
//            int i = 10 / 0;
            System.out.println(Thread.currentThread().getName());
            return "123";
        }, threadPool).whenComplete((t, u) -> {
            //计算完成时回调方法
            //处理返回值
            System.out.println("t = " + t);
            //whenComplete()在执行时获取的可能是线程池的线程也可能是main线程
            System.out.println(Thread.currentThread().getName());
            //处理发生异常
            System.out.println("u = " + u);
        });
        // whenCompleteAsync() 两个任务两个线程 异步
//        CompletableFuture.supplyAsync(() -> {
////            int i = 10 / 0;
//            System.out.println("上一个任务" + Thread.currentThread().getName());
//            return "123";
//        }, threadPool).whenCompleteAsync((t, u) -> {
//            //处理返回值
//            System.out.println("t = " + t);
//            System.out.println("当前任务" + Thread.currentThread().getName());
//            //处理发生异常
//            System.out.println("u = " + u);
//        });

//        CompletableFuture.supplyAsync(() -> {
//            int i = 1 / 0;
//            System.out.println("上一个任务" + Thread.currentThread().getName());
//            return "123";
//        }, threadPool).whenCompleteAsync((t, u) -> {
//            //处理返回值
//            System.out.println("t = " + t);
//            System.out.println("当前任务" + Thread.currentThread().getName());
//            //处理发生异常
//            System.out.println("u = " + u);
//        }).exceptionally((t) -> {//有异常执行 无异常不执行
//            System.out.println("下一个任务" + Thread.currentThread().getName());
//            return "处理成功";
//        });
//
//        CompletableFuture.runAsync(() -> {
//            int i = 1 / 0;
//            System.out.println("上一个任务" + Thread.currentThread().getName());
//        }, threadPool).whenCompleteAsync((t, u) -> {
//            //处理返回值
//            System.out.println("t = " + t);
//            System.out.println("当前任务" + Thread.currentThread().getName());
//            //处理发生异常
//            System.out.println("u = " + u);
//        }).exceptionally((t) -> {
//            System.out.println("下一个任务" + Thread.currentThread().getName());
//            //runAsync方法创建时无返回值 故return null
//            return null;
//        });
    }
}
